
// 无返回值无参数
// 函数式接口
// 只能有一个抽象方法
// 下面这个是注解, 如果没有或有多个抽象方法会报错
@FunctionalInterface
interface NoParameterNoReturn {
    void test();

    static void test2(){
        System.out.println("可以有静态方法");
    }
    default void test3(){
        System.out.println("可以有default方法");
    }
}

// 无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}

// 无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}

// 有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}

// 有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}

// 有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}

public class Test {
    public static void main(String[] args) {
        // 变量捕获
        int a = 10;
        // a = 100;//error
        NoParameterNoReturn noParameterNoReturn = () -> {
            //a = 19;//error
            System.out.println("捕获到一个变量 a == " + a + "我是一个常量，或者是一个没有改变过值的变量");
        };
        noParameterNoReturn.test();

        // 捕获到的要么是个final修饰的常量, 要么就是一个没有改变过值的变量, 否则报错
    }


    // Lambda表达式  就是匿名内部类的简化
    public static void main2(String[] args) {

        // 只有一条语句时, 可以省略大括号
        NoParameterNoReturn noParameterNoReturn = () -> System.out.println("一条语句可以省略大括号");
        noParameterNoReturn.test();

        // 只有一个参数时, 可以省略小括号
        OneParameterNoReturn oneParameterNoReturn = x -> {
            System.out.println("多条语句不能省略大括号");
            System.out.println(x+10);
        };
        oneParameterNoReturn.test(10);

        // 参数可以省略类型, 但是要么全省略,要么都不省略
        MoreParameterNoReturn moreParameterNoReturn = (x,y) -> System.out.println(x+y);
        moreParameterNoReturn.test(11,22);

        // 有返回值, 且只有返回语句时, 可以同时省略大括号 和 return
        NoParameterReturn noParameterReturn = () -> 666;
        System.out.println(noParameterReturn.test());

        OneParameterReturn oneParameterReturn = x -> x+10;
        System.out.println(oneParameterReturn.test(123));

        MoreParameterReturn moreParameterReturn = (x,y) -> {
            int ret = x + y + 1;
            return ret;
        };
        System.out.println(moreParameterReturn.test(1, 2));
    }

    // 匿名内部类
    public static void main1(String[] args) {
        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {
            @Override
            public void test() {
                System.out.println("这是一个匿名内部类");
            }
        };
        noParameterNoReturn.test();
    }
}
